`
https://leetcode.cn/problems/permutations/
`

/**
 * @param {number[]} nums
 * @return {number[][]}
 */
var permute = function (nums) {
  const res = []
  // 记录回溯算法的递归路径
  const track = []
  // track 中的元素会被标记为 true
  const used = new Array(nums.length).fill(false)

  // 回溯算法核心函数
  const backtrack = () => {
    if (track.length === nums.length) {
      // base case，到达叶子节点
      res.push(track.slice())
      return
    }

    // 回溯算法标准框架
    for (let i = 0; i < nums.length; i++) {
      // 已经存在 track 中的元素，不能重复选择
      if (used[i]) continue

      // 做选择
      track.push(nums[i])
      used[i] = true

      // 进入下一层回溯树
      backtrack()

      // 取消选择
      track.pop()
      used[i] = false
    }
  }
  backtrack()
  return res
};